/**
 * 统一错误处理工具
 * 提供友好的错误提示和详细的日志记录
 */

import { toast } from 'react-toastify'

// 错误类型定义
export const ErrorTypes = {
  NETWORK: 'network',
  API: 'api',
  FILE: 'file',
  VALIDATION: 'validation',
  AUTH: 'auth',
  UNKNOWN: 'unknown'
}

// 错误信息映射
const ERROR_MESSAGES = {
  // 网络错误
  'Network Error': '网络连接失败，请检查您的网络设置',
  'ECONNABORTED': '请求超时，请重试',
  'ERR_NETWORK': '网络连接失败，请检查您的网络设置',
  
  // API错误
  'API_KEY_INVALID': 'API密钥无效，请检查配置',
  'RATE_LIMIT_EXCEEDED': 'API调用次数超限，请稍后再试',
  'INSUFFICIENT_CREDITS': '账户余额不足，请充值',
  'NoMorePendingTasks': '免费配额已用完，请升级到付费计划',
  
  // 文件错误
  'FILE_TOO_LARGE': '文件大小超过限制（最大10MB）',
  'INVALID_FILE_TYPE': '不支持的文件格式，请上传 JPG/PNG/WEBP 图片',
  'FILE_UPLOAD_FAILED': '文件上传失败，请重试',
  
  // 验证错误
  'VALIDATION_ERROR': '输入数据格式不正确',
  'MISSING_PARAMETER': '缺少必需的参数',
  
  // 认证错误
  'UNAUTHORIZED': '未登录或登录已过期，请重新登录',
  'FORBIDDEN': '您没有权限执行此操作',
  
  // 3D生成错误
  'MODEL_GENERATION_FAILED': '3D模型生成失败，请检查图片质量',
  'MODEL_LOAD_FAILED': '3D模型加载失败，请刷新页面重试'
}

// 错误图标映射
const ERROR_ICONS = {
  [ErrorTypes.NETWORK]: '🌐',
  [ErrorTypes.API]: '⚠️',
  [ErrorTypes.FILE]: '📁',
  [ErrorTypes.VALIDATION]: '✋',
  [ErrorTypes.AUTH]: '🔒',
  [ErrorTypes.UNKNOWN]: '❌'
}

/**
 * 解析错误类型
 */
function getErrorType(error) {
  if (error.message?.includes('Network') || error.code === 'ERR_NETWORK') {
    return ErrorTypes.NETWORK
  }
  if (error.response?.status === 401) {
    return ErrorTypes.AUTH
  }
  if (error.response?.status >= 400 && error.response?.status < 500) {
    return ErrorTypes.API
  }
  if (error.code === 'FILE_TOO_LARGE' || error.code === 'INVALID_FILE_TYPE') {
    return ErrorTypes.FILE
  }
  if (error.code === 'VALIDATION_ERROR') {
    return ErrorTypes.VALIDATION
  }
  return ErrorTypes.UNKNOWN
}

/**
 * 获取友好的错误消息
 */
function getFriendlyMessage(error) {
  // 1. 尝试从错误对象中提取消息
  if (error.userMessage) {
    return error.userMessage
  }
  
  // 2. 查找错误代码对应的消息
  if (error.code && ERROR_MESSAGES[error.code]) {
    return ERROR_MESSAGES[error.code]
  }
  
  // 3. 查找错误消息对应的友好提示
  for (const [key, message] of Object.entries(ERROR_MESSAGES)) {
    if (error.message?.includes(key)) {
      return message
    }
  }
  
  // 4. HTTP状态码对应消息
  if (error.response?.status) {
    const status = error.response.status
    if (status === 400) return '请求参数错误，请检查输入'
    if (status === 401) return '未登录或登录已过期'
    if (status === 402) return '需要付费才能继续使用'
    if (status === 403) return '您没有权限执行此操作'
    if (status === 404) return '请求的资源不存在'
    if (status === 429) return 'API调用过于频繁，请稍后再试'
    if (status === 500) return '服务器内部错误，请稍后再试'
    if (status === 502) return '服务器网关错误'
    if (status === 503) return '服务暂时不可用，请稍后再试'
  }
  
  // 5. 返回原始错误消息（简化）
  const originalMessage = error.message || error.toString()
  if (originalMessage.length > 100) {
    return originalMessage.substring(0, 100) + '...'
  }
  return originalMessage || '发生了未知错误'
}

/**
 * 获取错误建议
 */
function getErrorSuggestion(errorType, error) {
  const suggestions = {
    [ErrorTypes.NETWORK]: [
      '检查网络连接是否正常',
      '尝试刷新页面',
      '切换到其他网络环境'
    ],
    [ErrorTypes.API]: [
      '稍后再试',
      '联系客服获取帮助'
    ],
    [ErrorTypes.FILE]: [
      '确保图片格式为 JPG/PNG/WEBP',
      '压缩图片到10MB以内',
      '使用更清晰的图片'
    ],
    [ErrorTypes.VALIDATION]: [
      '检查输入的数据格式',
      '确保填写了所有必填字段'
    ],
    [ErrorTypes.AUTH]: [
      '重新登录账号',
      '清除浏览器缓存'
    ],
    [ErrorTypes.UNKNOWN]: [
      '刷新页面重试',
      '检查浏览器控制台（F12）获取更多信息'
    ]
  }
  
  return suggestions[errorType] || suggestions[ErrorTypes.UNKNOWN]
}

/**
 * 主错误处理函数
 */
export function handleError(error, context = {}) {
  const errorType = getErrorType(error)
  const friendlyMessage = getFriendlyMessage(error)
  const suggestions = getErrorSuggestion(errorType, error)
  const icon = ERROR_ICONS[errorType]
  
  // 控制台输出详细错误信息（开发环境）
  if (import.meta.env.DEV) {
    console.group(`${icon} 错误详情`)
    console.error('错误类型:', errorType)
    console.error('原始错误:', error)
    console.error('上下文:', context)
    console.error('响应数据:', error.response?.data)
    console.error('建议:', suggestions)
    console.groupEnd()
  }
  
  // 显示Toast通知
  toast.error(
    <div className="flex flex-col gap-2">
      <div className="font-bold flex items-center gap-2">
        <span>{icon}</span>
        <span>{friendlyMessage}</span>
      </div>
      {suggestions.length > 0 && (
        <div className="text-xs opacity-90 mt-1">
          <div className="font-semibold mb-1">💡 建议：</div>
          <ul className="list-disc list-inside space-y-1">
            {suggestions.slice(0, 2).map((suggestion, i) => (
              <li key={i}>{suggestion}</li>
            ))}
          </ul>
        </div>
      )}
    </div>,
    {
      autoClose: 6000,
      closeButton: true,
      draggable: true
    }
  )
  
  // 返回结构化错误对象
  return {
    type: errorType,
    message: friendlyMessage,
    suggestions,
    originalError: error,
    context
  }
}

/**
 * 特定场景的错误处理
 */

// 文件上传错误
export function handleFileError(file, error) {
  const context = {
    fileName: file?.name,
    fileSize: file?.size,
    fileType: file?.type
  }
  
  return handleError(error, { ...context, source: 'file_upload' })
}

// API调用错误
export function handleApiError(endpoint, error, requestData = null) {
  const context = {
    endpoint,
    requestData,
    statusCode: error.response?.status,
    responseData: error.response?.data
  }
  
  return handleError(error, { ...context, source: 'api_call' })
}

// 3D模型加载错误
export function handleModelLoadError(modelUrl, error) {
  const context = {
    modelUrl,
    source: '3d_model_load'
  }
  
  return handleError(error, context)
}

// 认证错误
export function handleAuthError(error) {
  const context = {
    source: 'authentication'
  }
  
  return handleError(error, context)
}

/**
 * 成功提示（统一风格）
 */
export function showSuccess(message, options = {}) {
  const { icon = '✅', duration = 3000, ...restOptions } = options
  
  toast.success(
    <div className="flex items-center gap-2">
      <span className="text-lg">{icon}</span>
      <span>{message}</span>
    </div>,
    {
      autoClose: duration,
      ...restOptions
    }
  )
}

/**
 * 信息提示
 */
export function showInfo(message, options = {}) {
  const { icon = 'ℹ️', duration = 4000, ...restOptions } = options
  
  toast.info(
    <div className="flex items-center gap-2">
      <span className="text-lg">{icon}</span>
      <span>{message}</span>
    </div>,
    {
      autoClose: duration,
      ...restOptions
    }
  )
}

/**
 * 警告提示
 */
export function showWarning(message, options = {}) {
  const { icon = '⚠️', duration = 4000, ...restOptions } = options
  
  toast.warning(
    <div className="flex items-center gap-2">
      <span className="text-lg">{icon}</span>
      <span>{message}</span>
    </div>,
    {
      autoClose: duration,
      ...restOptions
    }
  )
}

export default {
  handleError,
  handleFileError,
  handleApiError,
  handleModelLoadError,
  handleAuthError,
  showSuccess,
  showInfo,
  showWarning
}

